package map;

import java.util.Vector;

import mapelements.background.Background;
import mapelements.foreground.Foreground;


/**rappresenta una classe che si occupa di gestire ed inoltrare i messaggi di tipo MapEvent.
 * Messaggi di tipo MapEvent sono messaggi che interessano la mappa a livello molto alto: questi messaggi
 * non si curano circa modifiche all'interno di un MapElement bensì se questo deve modificare le strutture
 * dati della AbstractMap. Eventi di questo tipo dovrebbero essere generati solo se:
 * <ul>
 *  <li>un MapElement viene inserito nella mappa/li>
 *  <li>un MapElement viene eliminato dalla mappa</li>
 *  <li>un MapElement viene settato nella mappa</li>
 * </ul>
 * 
 * @author koldar
 * @version 1.1
 */
public class MapEventDispatcher{
	
	private Vector<MapListener> listeners;
	
	public MapEventDispatcher(){
		this.listeners=new Vector<MapListener>(0,1);
	}
	
	public void addListener(MapListener arg0){
		this.listeners.add(arg0);
	}
	public void removeListener(MapListener arg0){
		this.listeners.remove(arg0);
	}
	public MapListener[] getListeners(){
		return (MapListener[])this.listeners.toArray();
	}
	public void fireBackgroundChanged(AbstractMap source,Background newbkg,int action){
		MapEvent<Background> event=new MapEvent<Background>(source,action,newbkg);
		for(MapListener l:this.listeners){
			l.backgroundChanged(event);
		}
	}
	
	public void fireForegroundChanged(AbstractMap source,Foreground newfrg,int action){
		MapEvent<Foreground> event=new MapEvent<Foreground>(source,action,newfrg);
		for(MapListener l:this.listeners){
			l.foregroundChanged(event);
		}
	}
	
	public void fireMapResolutionEvent(AbstractMap source,int newmapresolution){
		for (MapListener l:this.listeners){
			l.mapresolutionChanged(new MapResolutionEvent(source,newmapresolution));
		}
	}
	
	public void fireWidthEvent(AbstractMap source,int newwidth){
		for (MapListener l:this.listeners){
			l.widthChanged(new MapWidthEvent(source,newwidth));
		}
	}
	
	public void fireHeightEvent(AbstractMap source,int newheight){
		for (MapListener l:this.listeners){
			l.heightChanged(new MapHeightEvent(source,newheight));
		}
	}
}
